using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using ENProyectoSIETE;
using CADProyectoSIETE.Properties;
using System.Configuration;
using System.Data;
using System.Data.Sql;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using CADProyectoSIETE.BDProyecto7DataSetTableAdapters;

namespace CADProyectoSIETE
{
    public class MapaCAD
    {
        private string conexion;

        public string insertarMapa(ENMapa mapa)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                MapaTableAdapter da = new MapaTableAdapter();
                da.Insert(mapa.NombreMapa, mapa.ImagenMapa, mapa.DescripcionMapa);

                DataSet bdvirtuallocalizacionmapa = new DataSet();
                SqlDataAdapter dalocalizacionmapa = new SqlDataAdapter("select * from mapalocalizacion", conex);

                dalocalizacionmapa.Fill(bdvirtuallocalizacionmapa, "mapalocalizacion");
                DataTable tablalocalizacionmapa = new DataTable();
                tablalocalizacionmapa = bdvirtuallocalizacionmapa.Tables["mapalocalizacion"];

                foreach(ENMapaLocalizacion mapaloc in mapa.LocalizacionesMapa){
                    DataRow nuevafilalocalizacionmapa = tablalocalizacionmapa.NewRow();
                    nuevafilalocalizacionmapa[0] = obtenerProxID();
                    nuevafilalocalizacionmapa[1] = mapaloc.IDLocalizacion;
                    nuevafilalocalizacionmapa[2] = mapaloc.CordX;
                    nuevafilalocalizacionmapa[3] = mapaloc.CordY;

                    tablalocalizacionmapa.Rows.Add(nuevafilalocalizacionmapa);
                }

                SqlCommandBuilder cbuilderlocalizacionmapa = new SqlCommandBuilder(dalocalizacionmapa);
                dalocalizacionmapa.Update(bdvirtuallocalizacionmapa,"mapalocalizacion");
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                conex.Close();
            }

            conex.Close();
            return "OK";
        }

        public DataSet obtenerLocalizacionesMapa(int index)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            DataSet bdvirtual = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter("select * from Localizacion where idLocalizacion in (select idLocalizacion from MapaLocalizacion where idMapa = "+ index.ToString() + ')', conex);

            da.Fill(bdvirtual, "mapa");
            return bdvirtual;
        }

        public DataSet obtenerTodasLocalizacionesMapa()
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            DataSet bdvirtual = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter("select * from mapalocalizacion", conex);

            da.Fill(bdvirtual, "mapalocalizacion");
            return bdvirtual;
        }

        public string borrarMapa(ENMapa mapa)
        {
            int i = 0;
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select * from Mapa ", conex);

                da.Fill(bdvirtual, "mapa");
                //Obtenemos la tabla localizacion
                DataTable tabla = new DataTable();
                tabla = bdvirtual.Tables["mapa"];

                foreach (DataRow registro in tabla.Rows)
                {
                    if (registro["nombreMapa"].ToString() == mapa.NombreMapa)
                    {
                        tabla.Rows[i].Delete();
                    }
                    i++;
                }

                SqlCommandBuilder cbuilder = new SqlCommandBuilder(da);
                da.Update(bdvirtual, "mapa");
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                conex.Close();
            }

            conex.Close();
            return "OK";
        }

        public DataSet obtenerMapas()
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select * from Mapa", conex);

                da.Fill(bdvirtual, "mapa");
                return bdvirtual;
            }
            catch (Exception ex)
            {
                DataSet bdvacia = new DataSet();
                throw ex;
            }
        }

        public DataTable obtenerMapaNombre(string nombre, string nom_des)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = null;
                if (nom_des == "nombre")
                {
                    da = new SqlDataAdapter("select * from mapa where nombreMapa LIKE '%" + nombre + "%'", conex);
                }
                else if (nom_des == "descripcion")
                {
                    da = new SqlDataAdapter("select * from mapa where descripcionMapa LIKE '%" + nombre + "%'", conex);
                }
                da.Fill(bdvirtual, "mapa");
                DataTable tabla = new DataTable();
                tabla = bdvirtual.Tables["mapa"];

                return tabla;
            }
            catch
            {
                DataTable tablavacia = new DataTable();
                return tablavacia;
            }
            finally
            {
                conex.Close();
            }
        }

        public int obtenerProxID()
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select idMapa from Mapa order by idMapa desc", conex);
                int indice;

                da.Fill(bdvirtual, "mapa");
                indice = int.Parse(bdvirtual.Tables["mapa"].Rows[0][0].ToString());
                //indice++;
                return (indice);
            }
            catch (Exception ex)
            {
                DataSet bdvacia = new DataSet();
                throw ex;
            }
        }

        public ENMapa obtenerMapa(int index)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select * from Mapa where idMapa=" + index.ToString(), conex);

                da.Fill(bdvirtual, "mapa");
                ENMapa mapa = new ENMapa();

                foreach (DataRow registro in bdvirtual.Tables["mapa"].Rows)
                {
                    mapa.IdMapa = int.Parse(registro[0].ToString());
                    mapa.NombreMapa = registro[1].ToString();
                    mapa.ImagenMapa = registro[2].ToString();
                    mapa.DescripcionMapa = registro[3].ToString();
                }

                return mapa;
            }
            catch
            {
                ENMapa mapaerror = new ENMapa();
                return mapaerror;
            }
            finally
            {
                conex.Close();
            }
        }

        public void borrarMapa(int id) {
            try
            {
                MapaTableAdapter mapTableAdapter = new MapaTableAdapter();
                mapTableAdapter.Delete(id);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public string editarMapa(ENMapa mapa)
        {
            string cadenaConexion = Settings.Default.BDProyecto7ConnectionString;
            SqlConnection conex = new SqlConnection(cadenaConexion);

            try
            {
                int i = 0;

                DataSet bdvirtual = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("select * from mapa", conex);

                da.Fill(bdvirtual, "mapa");

                DataTable tabla = new DataTable();
                tabla = bdvirtual.Tables["mapa"];

                foreach(DataRow registro in tabla.Rows)
                {
                    if ((int)registro["idMapa"] == mapa.IdMapa)
                    {
                        tabla.Rows[i][0] = mapa.IdMapa;
                        tabla.Rows[i][1] = mapa.NombreMapa;
                        tabla.Rows[i][2] = mapa.ImagenMapa;
                        tabla.Rows[i][3] = mapa.DescripcionMapa;
                    }

                    i++;
                }

                SqlCommandBuilder cbuilder = new SqlCommandBuilder(da);
                da.Update(bdvirtual, "mapa");

                //--------------Insertarmos las localizaciones asociadas
                DataSet bdvirtuallocalizacion = new DataSet();
                SqlDataAdapter dalocalizacion = new SqlDataAdapter("select * from mapalocalizacion", conex);

                dalocalizacion.Fill(bdvirtuallocalizacion, "mapalocalizacion");
                DataTable tablalocalizacion = new DataTable();
                tablalocalizacion = bdvirtuallocalizacion.Tables["mapalocalizacion"];

                //Primero borramos las localizaciones que habia
                i = 0;
                foreach (DataRow registro in tablalocalizacion.Rows)
                {
                    if((int)registro["idmapa"] == mapa.IdMapa)
                    {
                        tablalocalizacion.Rows[i].Delete();
                    }

                    i++;
                }
                SqlCommandBuilder cbuilderlocalizaciones = new SqlCommandBuilder(dalocalizacion);
                dalocalizacion.Update(bdvirtuallocalizacion, "mapalocalizacion");

                //Insertamos las localizaciones del EN (estan incluidas las que borramos antes)
                DataSet bdvirtuallocalizacioninsertar = new DataSet();
                SqlDataAdapter dalocalizacioninsertar = new SqlDataAdapter("select * from mapalocalizacion", conex);

                dalocalizacioninsertar.Fill(bdvirtuallocalizacioninsertar, "mapalocalizacion");
                DataTable tablalocalizacioninsertar = new DataTable();
                tablalocalizacioninsertar = bdvirtuallocalizacioninsertar.Tables["mapalocalizacion"];

                foreach (ENMapaLocalizacion mapaloc in mapa.LocalizacionesMapa)
                {
                    DataRow nuevafilalocalizacionmapa = tablalocalizacioninsertar.NewRow();
                    nuevafilalocalizacionmapa[0] = obtenerProxID();
                    nuevafilalocalizacionmapa[1] = mapaloc.IDLocalizacion;
                    nuevafilalocalizacionmapa[2] = mapaloc.CordX;
                    nuevafilalocalizacionmapa[3] = mapaloc.CordY;

                    tablalocalizacioninsertar.Rows.Add(nuevafilalocalizacionmapa);
                }

                SqlCommandBuilder cbuilderlocalizacionmapainsertar = new SqlCommandBuilder(dalocalizacioninsertar);
                dalocalizacioninsertar.Update(bdvirtuallocalizacioninsertar, "mapalocalizacion");
                //------------------------------------------
            }
            catch(Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                conex.Close();
            }

            return "OK";
        }
    }
}


